{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "# coding: utf-8\n",
    "from datetime import datetime, timedelta\n",
    "import urllib\n",
    "import os"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 函数名：scrape_station\n",
    "# 参数：state, city\n",
    "# 函数功能：从https://www.almanac.com/获取指定城市在指定时间区间内的天气信息。其中，城市名字由州和市确定，例如佛罗里达州迈阿密市为（FL, Miami）。\n",
    "# 原作者：Randy Olson\n",
    "# 程序修改：西南科技大学 通信1701 刘仲夏小组\n",
    "# 修改时间：2020年8月29日\n",
    "\n",
    "def scrape_station(state, city):\n",
    "    # 此处修改获取天气信息的时间段，左闭右开：[current_date, end_date)\n",
    "    current_date = datetime(year=2014, month=7, day=1)\n",
    "    end_date = datetime(year=2014, month=8, day=1)\n",
    "\n",
    "    # 为每个机场所在城市创建单独的文件夹，用于保存html网页。\n",
    "    dir_name = (\"{}-{}\").format(state, city)\n",
    "    os.mkdir(dir_name)\n",
    "    \n",
    "    # 由于原作者写本代码的时候，目标网站还没有反爬措施，但是随着爬虫日益猖獗，该天气网站增加了反爬措施。使用apikey的方式，目前没找到爬取数据的办法。\n",
    "    \n",
    "    # 格式为：(洲,市, YYYY-MM-DD)\n",
    "    lookup_URL = 'https://www.almanac.com/weather/history/{}/{}/{}-{}-{}'\n",
    "    \n",
    "    #伪造请求头，其中包括Cookie和UA等欺骗信息\n",
    "    headers = {\n",
    "    'Sec-Fetch-Dest': \"document\",\n",
    "    'Cookie': \"_vuid=251ab9fb-f390-484f-8919-ab9fa3acaa9e; _vuid=251ab9fb-f390-484f-8919-ab9fa3acaa9e; _vuid=251ab9fb-f390-484f-8919-ab9fa3acaa9e; has_js=1; __gads=ID=970563c97e41b425:T=1598796131:S=ALNI_MaJx39gB7pOCYNSGUiSeG5r_EOnKA; _ga=GA1.2.1898351737.1598796130; _gid=GA1.2.529034958.1598796132; ltkSubscriber-Footer=eyJsdGtDaGFubmVsIjoiZW1haWwiLCJsdGtUcmlnZ2VyIjoibG9hZCJ9; GSIDuTRIeOHB3qZL=ea4e6011-9474-492d-aef0-604aac7f1bb3; STSID307658=ba991bac-57fe-4fb0-ad61-4d6ee3d65679; ltkpopup-suppression-7c7cf77d-cc93-41b5-a050-b01d29782461=1; __qca=P0-1665003281-1598796238044; _vuid=251ab9fb-f390-484f-8919-ab9fa3acaa9e; ltkpopup-suppression-6e3e6c40-4bcb-4b08-9fb6-ae12dd98ff07=1; ltkpopup-session-depth=12-1; mylocation=%5B%7B%22type%22%3A%22other%22%2C%22id%22%3A%22295004%22%2C%22county%22%3A%22Miami-Dade%22%2C%22addcounty%22%3A0%2C%22country%22%3A%22US%22%2C%22label%22%3A%22Miami%2C+FL%22%2C%22uniqid%22%3A%22ZxwqUDik%22%7D%2C%7B%22type%22%3A%22zip%22%2C%22id%22%3A%2299850%22%2C%22county%22%3A%22Juneau%22%2C%22addcounty%22%3A0%2C%22country%22%3A%22US%22%2C%22label%22%3A%22Juneau%2C+AK%22%2C%22uniqid%22%3A%22sK3eVQ0w%22%7D%2C%7B%22type%22%3A%22zip%22%2C%22id%22%3A%2299850%22%2C%22county%22%3A%22Juneau%22%2C%22addcounty%22%3A0%2C%22country%22%3A%22US%22%2C%22label%22%3A%22Juneau%2C+AK%22%2C%22uniqid%22%3A%22gTT5YMeb%22%7D%2C%7B%22used_default%22%3Atrue%2C%22type%22%3A%22other%22%2C%22id%22%3A%22866642%22%2C%22country%22%3A%22US%22%2C%22label%22%3A%22Dublin%2C+NH%22%2C%22uniqid%22%3A%22Qdt9ogC7%22%7D%5D\",\n",
    "    'Host': \"www.almanac.com\",\n",
    "    'Sec-Fetch-Mode': \"navigate\",\n",
    "    'Sec-Fetch-Site': \"same-origin\",\n",
    "    'Sec-Fetch-User': \"?1\",\n",
    "    'Upgrade-Insecure-Requests': \"1\",\n",
    "    'Connection': \"keep-alive\",\n",
    "    'User-Agent': \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.135 Safari/537.36\",\n",
    "    'Cache-Control': \"no-cache\",\n",
    "    'Postman-Token': \"c7d43f08-aa2b-4ae6-a622-ebf6e6953893\"\n",
    "    }\n",
    "\n",
    "    # 每一天都会被保存成一个网页。\n",
    "    while current_date != end_date:\n",
    "\n",
    "        # 打印当前日期（debug用，可忽略）\n",
    "        print(current_date)\n",
    "        \n",
    "        # 将对应参数填入lookup_URL的4处格式化字符串的位置，按照“州，市、年、月、日”的顺序\n",
    "        formatted_lookup_URL = lookup_URL.format(state,\n",
    "                                                 city,\n",
    "                                                 current_date.year,\n",
    "                                                 current_date.month,\n",
    "                                                 current_date.day)\n",
    "\n",
    "        # 构造请求\n",
    "        req = urllib.request.Request(url = formatted_lookup_URL, headers = headers)\n",
    "        # 加载网页，ignore参数的含义是：如果网页解码出现错误则忽略错误\n",
    "        html = urllib.request.urlopen(req).read().decode(\"utf-8\",'ignore')\n",
    "        # 将爬取到的网页保存起来，存在前面建好的文件夹中，文件名用：年-月-日.html的格式来存\n",
    "        out_file_name = '{}/{}-{}-{}.html'.format(dir_name, current_date.year,\n",
    "                                                  current_date.month,\n",
    "                                                  current_date.day)\n",
    "        \n",
    "        # 写入html文件并保存，编码改为utf-8防止程序因为Unicode编码而报的异常\n",
    "        with open(out_file_name, 'w', encoding = 'utf-8') as out_file:\n",
    "            out_file.write(html)\n",
    "        # 当前日期+1，进入下一次循环。\n",
    "        current_date += timedelta(days=1)\n",
    "        # 设置休眠时间2秒 防止HTTP 429（请求太多）错误\n",
    "        time.sleep(2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": "2014-07-01 00:00:00\n2014-07-02 00:00:00\n2014-07-03 00:00:00\n2014-07-04 00:00:00\n2014-07-05 00:00:00\n2014-07-06 00:00:00\n2014-07-07 00:00:00\n2014-07-08 00:00:00\n2014-07-09 00:00:00\n2014-07-10 00:00:00\n2014-07-11 00:00:00\n2014-07-12 00:00:00\n2014-07-13 00:00:00\n2014-07-14 00:00:00\n2014-07-15 00:00:00\n2014-07-16 00:00:00\n"
    },
    {
     "output_type": "error",
     "ename": "HTTPError",
     "evalue": "HTTP Error 429: Too Many Requests",
     "traceback": [
      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[1;31mHTTPError\u001b[0m                                 Traceback (most recent call last)",
      "\u001b[1;32m<ipython-input-5-2fccf7898938>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n\u001b[0;32m      1\u001b[0m \u001b[1;31m# 选定城市（例如佛罗里达州，迈阿密），执行爬取保存网页函数scrape_station\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 2\u001b[1;33m \u001b[0mscrape_station\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m'FL'\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;34m'Miami'\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m",
      "\u001b[1;32m<ipython-input-4-78fc27415711>\u001b[0m in \u001b[0;36mscrape_station\u001b[1;34m(state, city)\u001b[0m\n\u001b[0;32m     51\u001b[0m         \u001b[0mreq\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0murllib\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mrequest\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mRequest\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0murl\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mformatted_lookup_URL\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mheaders\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mheaders\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m     52\u001b[0m         \u001b[1;31m# 加载网页，ignore参数的含义是：如果网页解码出现错误则忽略错误\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 53\u001b[1;33m         \u001b[0mhtml\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0murllib\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mrequest\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0murlopen\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mreq\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mread\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mdecode\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m\"utf-8\"\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;34m'ignore'\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m     54\u001b[0m         \u001b[1;31m# 将爬取到的网页保存起来，存在前面建好的文件夹中，文件名用：年-月-日.html的格式来存\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m     55\u001b[0m         out_file_name = '{}/{}-{}-{}.html'.format(dir_name, current_date.year,\n",
      "\u001b[1;32mD:\\Python37\\lib\\urllib\\request.py\u001b[0m in \u001b[0;36murlopen\u001b[1;34m(url, data, timeout, cafile, capath, cadefault, context)\u001b[0m\n\u001b[0;32m    220\u001b[0m     \u001b[1;32melse\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    221\u001b[0m         \u001b[0mopener\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0m_opener\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 222\u001b[1;33m     \u001b[1;32mreturn\u001b[0m \u001b[0mopener\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mopen\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0murl\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mdata\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mtimeout\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m    223\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    224\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0minstall_opener\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mopener\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;32mD:\\Python37\\lib\\urllib\\request.py\u001b[0m in \u001b[0;36mopen\u001b[1;34m(self, fullurl, data, timeout)\u001b[0m\n\u001b[0;32m    529\u001b[0m         \u001b[1;32mfor\u001b[0m \u001b[0mprocessor\u001b[0m \u001b[1;32min\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mprocess_response\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mget\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mprotocol\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m[\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    530\u001b[0m             \u001b[0mmeth\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mgetattr\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mprocessor\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mmeth_name\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 531\u001b[1;33m             \u001b[0mresponse\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mmeth\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mreq\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mresponse\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m    532\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    533\u001b[0m         \u001b[1;32mreturn\u001b[0m \u001b[0mresponse\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;32mD:\\Python37\\lib\\urllib\\request.py\u001b[0m in \u001b[0;36mhttp_response\u001b[1;34m(self, request, response)\u001b[0m\n\u001b[0;32m    639\u001b[0m         \u001b[1;32mif\u001b[0m \u001b[1;32mnot\u001b[0m \u001b[1;33m(\u001b[0m\u001b[1;36m200\u001b[0m \u001b[1;33m<=\u001b[0m \u001b[0mcode\u001b[0m \u001b[1;33m<\u001b[0m \u001b[1;36m300\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    640\u001b[0m             response = self.parent.error(\n\u001b[1;32m--> 641\u001b[1;33m                 'http', request, response, code, msg, hdrs)\n\u001b[0m\u001b[0;32m    642\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    643\u001b[0m         \u001b[1;32mreturn\u001b[0m \u001b[0mresponse\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;32mD:\\Python37\\lib\\urllib\\request.py\u001b[0m in \u001b[0;36merror\u001b[1;34m(self, proto, *args)\u001b[0m\n\u001b[0;32m    567\u001b[0m         \u001b[1;32mif\u001b[0m \u001b[0mhttp_err\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    568\u001b[0m             \u001b[0margs\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;33m(\u001b[0m\u001b[0mdict\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;34m'default'\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;34m'http_error_default'\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;33m+\u001b[0m \u001b[0morig_args\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 569\u001b[1;33m             \u001b[1;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_call_chain\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m*\u001b[0m\u001b[0margs\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m    570\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    571\u001b[0m \u001b[1;31m# XXX probably also want an abstract factory that knows when it makes\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;32mD:\\Python37\\lib\\urllib\\request.py\u001b[0m in \u001b[0;36m_call_chain\u001b[1;34m(self, chain, kind, meth_name, *args)\u001b[0m\n\u001b[0;32m    501\u001b[0m         \u001b[1;32mfor\u001b[0m \u001b[0mhandler\u001b[0m \u001b[1;32min\u001b[0m \u001b[0mhandlers\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    502\u001b[0m             \u001b[0mfunc\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mgetattr\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mhandler\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mmeth_name\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 503\u001b[1;33m             \u001b[0mresult\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mfunc\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m*\u001b[0m\u001b[0margs\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m    504\u001b[0m             \u001b[1;32mif\u001b[0m \u001b[0mresult\u001b[0m \u001b[1;32mis\u001b[0m \u001b[1;32mnot\u001b[0m \u001b[1;32mNone\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    505\u001b[0m                 \u001b[1;32mreturn\u001b[0m \u001b[0mresult\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;32mD:\\Python37\\lib\\urllib\\request.py\u001b[0m in \u001b[0;36mhttp_error_default\u001b[1;34m(self, req, fp, code, msg, hdrs)\u001b[0m\n\u001b[0;32m    647\u001b[0m \u001b[1;32mclass\u001b[0m \u001b[0mHTTPDefaultErrorHandler\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mBaseHandler\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    648\u001b[0m     \u001b[1;32mdef\u001b[0m \u001b[0mhttp_error_default\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mreq\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mfp\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mcode\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mmsg\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mhdrs\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 649\u001b[1;33m         \u001b[1;32mraise\u001b[0m \u001b[0mHTTPError\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mreq\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mfull_url\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mcode\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mmsg\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mhdrs\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mfp\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m    650\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    651\u001b[0m \u001b[1;32mclass\u001b[0m \u001b[0mHTTPRedirectHandler\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mBaseHandler\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;31mHTTPError\u001b[0m: HTTP Error 429: Too Many Requests"
     ]
    }
   ],
   "source": [
    "# 选定城市（例如佛罗里达州，迈阿密），执行爬取保存网页函数scrape_station\n",
    "scrape_station('FL', 'Miami')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3.7.4 64-bit",
   "language": "python",
   "name": "python_defaultSpec_1599094964089"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.4-final"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}